package com.ingenieria.industrial.service.implementacion;

import com.ingenieria.industrial.dao.implementacion.UsuarioDAO;
import com.ingenieria.industrial.dto.Usuario;
import com.ingenieria.industrial.service.diseño.IUsuarioService;
import java.sql.SQLException;
import java.util.ArrayList;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

public class UsuarioService extends BaseSimpleService implements IUsuarioService {

    private UsuarioDAO dao;

    @Override
    public boolean insert(Usuario usuario) throws Exception {
        try {
            begin();
            return dao.insert(usuario);
        } catch (SQLException sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public boolean insertInfAdic(Usuario usuario) throws Exception {
        try {
            begin();
            return dao.insertInfAdic(usuario);
        } catch (SQLException sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public boolean update(Usuario usuario) throws Exception {
        try {
            begin();
            return dao.update(usuario);
        } catch (SQLException sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public boolean updateInfAdic(Usuario usuario) throws Exception {
        try {
            begin();
            return dao.updateInfAdic(usuario);
        } catch (SQLException sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public boolean delete(String cod_usu) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public ArrayList<Usuario> getAll() throws Exception {
        try {
            begin();
            return dao.getAll();
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public Usuario getById(String cod_usu) throws Exception {
        try {
            begin();
            return dao.getById(cod_usu);
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    protected void initDAO() throws SQLException {
        dao = new UsuarioDAO(transact);
    }

    @Override
    public Usuario login(String cod_usu, String clave) throws Exception {
        try {
            begin();
            StandardPBEStringEncryptor s = new StandardPBEStringEncryptor();
            s.setPassword(obtenerClaveEncript());
            ArrayList<Usuario> lista_ini = getAll();
            ArrayList<String> lista = new ArrayList<>();
            String clave_ini = "";
            for (Usuario oUsuario : lista_ini) {
                clave_ini = oUsuario.getClave();
                clave_ini = s.decrypt(clave_ini);
                lista.add(oUsuario.getCod_usu() + "_" + clave_ini);
            }
            int pos = lista.indexOf(cod_usu + "_" + clave);
            if (pos > -1) {
                return lista_ini.get(pos);
            } else {
                return null;
            }
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public Usuario getInfPer(String cod_usu) throws Exception {
        try {
            begin();
            return dao.getInfPer(cod_usu);
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public Usuario getInfAdic(String cod_usu) throws Exception {
        try {
            begin();
            return dao.getInfAdic(cod_usu);
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public ArrayList<Usuario> getListaAlumnos() throws Exception {
        try {
            begin();
            return dao.getListaAlumnos();
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public Usuario getByEmail(String email) throws Exception {
        try {
            begin();
            return dao.getByEmail(email);
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public boolean updPassByEmail(String pass, String cod_usu) throws Exception {
        try {
            begin();
            return dao.updPassByEmail(pass, cod_usu);
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public Usuario getByPassActCodUsu(String passAct, String cod_usu) throws Exception {
        try {
            begin();
            StandardPBEStringEncryptor s = new StandardPBEStringEncryptor();
            s.setPassword(obtenerClaveEncript());
            ArrayList<Usuario> lista_ini = getAll();
            ArrayList<String> lista = new ArrayList<>();
            String clave_ini = "";
            for (Usuario oUsuario : lista_ini) {
                clave_ini = oUsuario.getClave();
                clave_ini = s.decrypt(clave_ini);
                lista.add(oUsuario.getCod_usu() + "_" + clave_ini);
            }
            int pos = lista.indexOf(cod_usu + "_" + passAct);
            if (pos > -1) {
                return lista_ini.get(pos);
            } else {
                return null;
            }
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

    @Override
    public boolean changePass(Usuario usuario) throws Exception {
        try {
            begin();
            StandardPBEStringEncryptor s = new StandardPBEStringEncryptor();
            s.setPassword(obtenerClaveEncript());
            usuario.setClave(s.encrypt(usuario.getClave()));
            return dao.changePass(usuario);
        } catch (Exception sos) {
            throw handleError(sos);
        } finally {
            handleRelease();
        }
    }

}
